package com.vogue.supplymall.match.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class DealDataMethod {
	/**
	 * 用来处理SQL语句查出的结果类似一个品项对应多个单位的情况，该方法可以将一样的品项信息合为一条，将对应的单位信息整理为list和品项
	 * 信息存在一起
	 * @param paramList sql语句查出的结果
	 * @param paramMap 里面diffType是Sting类型，区别是同一个品项的字段，例如品项id；speCol是List<String>类型：区别不能合并的字段，一般sql语句中加前缀，例如iu_unit,iu_就是区别的标记
	 * @return
	 * @throws Exception
	 */
	public static List<Map<String, Object>> dealDataMethod(List<Map<String, Object>> paramList,Map<String, Object> paramMap) throws Exception {
		//最终返回的list
				List<Map<String, Object>> finalList=new ArrayList<>();
				//这是所有需要合并的数据得第一次循环，将值存入map中
				Map<String, Object> rightMap=new HashMap<>();
				//临时存储用的map
				Map<String, Object> tempMap=new HashMap<>();
				//用于记录循环的几次
				int loopCnt=0;
				//用于记录区分需要合并的字段得值
				String diffVlaue="";
				//存储需要合并的字段的key值
				List<String> mergeList=new ArrayList<>();
				
				//参数为空直接返回
				if(paramList.size()==0||paramList.get(0)==null||paramMap.size()==0){
					return finalList;
				}
				
				//得到需要合并的字段的标记
				String diffType=(String) paramMap.get("diffType");
				//得到不能合并的字段的标记
				List<String> speCol=(List<String>) paramMap.get("speCol");
				
				//得到需要合并的字段的key值和不需要合并的字段的key值
				Map<String, Object> firstMap=paramList.get(0);
				//得到map的key值
				Set<String> keySet=firstMap.keySet();
				for(String key:keySet){
					boolean flag=true;
					for(String col:speCol){
						if(key.startsWith(col)){
							flag=false;
						}
					}
					
					if(flag){
						mergeList.add(key);
					}
					
				}
				
				//如果没有不需要合并的字段，直接返回
				if(mergeList.size()==0){
					return finalList;
				}
				
				//整理数据
				for(Map<String, Object> map:paramList){
					loopCnt++;
					
					//说明还需要合并需要合并的字段
					if(diffVlaue.equals(map.get(diffType).toString())){
						//存储不能合并的字段
						for(int i=0;i<speCol.size();i++){
							String col=speCol.get(i);
							//存储不能合并的字段的map和list
							Map<String, Object> notMergeMap=new HashMap<>();
							List<Map<String, Object>> notMergeList=(List<Map<String, Object>>) tempMap.get(i+"");
							
							//根据key值得到Value值
							for(String key:keySet){
								if(key.startsWith(col)){
									notMergeMap.put(key.substring(col.length(),key.length()), map.get(key));
								}
							}
							
							//将不能合并的字段的map存入notMergeList中,将notMergeList存入tempMap中
							notMergeList.add(notMergeMap);
							tempMap.put(i+"", notMergeList);					
						}
					}else{
						
						//不是第一次循环，说明上一个需要合并字段的所有值都已经存入，需要将最终的值存入finalList中
						if(loopCnt>1){
							for(int i=0;i<speCol.size();i++){
								String col=speCol.get(i);
								col=col.substring(0, col.length()-1);
								rightMap.put(col, tempMap.get(i+""));
							}
							
							finalList.add(rightMap);
							rightMap=new HashMap<>();
							tempMap=new HashMap<>();
							
						}
						
						//首先存储需要合并的字段
						for(String mKey:mergeList){
							rightMap.put(mKey, map.get(mKey));
						}
						//然后存储不能合并的字段
						for(int i=0;i<speCol.size();i++){
							String col=speCol.get(i);
							//存储不能合并的字段的map和list
							Map<String, Object> notMergeMap=new HashMap<>();
							List<Map<String, Object>> notMergeList=new ArrayList<>();
							
							//根据key值得到Value值
							for(String key:keySet){
								if(key.startsWith(col)){
									notMergeMap.put(key.substring(col.length(),key.length()), map.get(key));
								}
							}
							
							//将不能合并的字段的map存入notMergeList中,将notMergeList存入tempMap中
							notMergeList.add(notMergeMap);
							tempMap.put(i+"", notMergeList);					
						}
						
						//赋值
						diffVlaue=map.get(diffType).toString();
					}
					
					//如果是最后一次循环，将结果存入finalList中
					if(loopCnt==paramList.size()){
						for(int i=0;i<speCol.size();i++){
							String col=speCol.get(i);
							col=col.substring(0, col.length()-1);
							rightMap.put(col, tempMap.get(i+""));
						}
						
						finalList.add(rightMap);
					}
					
				}
				
				return finalList;
	}
}
